package day12;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

//测试定长线程池
public class TestFixed {
    public static void main(String[] args) {
        //测试 参数：最大支持的并发数量
//        ExecutorService es = Executors.newFixedThreadPool(3);
//        for (int i = 0; i < 10; i++) {
//            es.execute(()->{
//                System.out.println(Thread.currentThread().getName());
//                try {
//                    Thread.sleep(3000);//模拟任务时长
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            });
//        }
//        //关闭池 但是已经添加完的任务也会执行
//        es.shutdown();
        //案例：有一个餐厅 需要做5盘菜 但是只有3个灶台(一次性可以同时炒三个菜)
        //最后统计 炒5盘菜 一共花了多少时间
        String[] names = {"辣椒炒肉","黄豆焖鸡爪","小鸡炖蘑菇","爆辣甲鱼","红烧大虾"};
        long[] times = {1000,3000,5000,5000,2000};
        ExecutorService es = Executors.newFixedThreadPool(3);
        long start = System.currentTimeMillis();
        long end = 0;
        for (int i = 0; i < names.length; i++) {
            int index = i;
            es.execute(()->{
                try {
                    System.out.println("开始做菜:"+names[index]);
                    Thread.sleep(times[index]);
                    System.out.println("已经做好:"+names[index]);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        es.shutdown();
        //结束的时间 一定是线程池关闭了 而且里面的任务也执行完了
        //es.isTerminated(); 用于判断线程池里的任务 是否执行结束
        while (true){
            if (es.isTerminated()){
                end = System.currentTimeMillis();
                break;
            }

        }
        System.out.println("总花费时间:"+(end-start)+"ms");
    }
}
